﻿package com.ti.ouxun.util.adapter;

import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 对象简单适配器 类似于 SimpleAdapter
 * 
 * <p>1、使用该适配器时，对象中必须要有待取值字段的 get 方法，
 * <br>如 ：<br>User 对象中 若要取 userName 字段的值，那么 User 中就要有 getUserName() 方法.</p>
 * 
 * <p>2、在<strong>构造方法</strong>中 fieldsName 的含义是 待取值的字段名数组。
 * <br> 如 ：
 * <br> User 对象中 要取值的字段有 userName、userAge, 那么 fieldsName 的值就设置为  new String[]{"userName", "userAge"},
 * 这样该适配器内部就会调用 User 的 getUserName()、 getUserAge() 方法来达到取值的目的，所以 对于要取值的字段，User 必须要有相应的 get 方法
 * </p>
 * 
 * <p>3、该适配器中默认只可以为 ImageView 以及 TextView 控件绑定数据，若要 使用其他的一些 View 则可以调用 setViewBinder() 方法，实现 ViewBinder接口中的 setViewValue() 方法来达到
 * 将值绑定到其他的一些 View 上。</p>
 * 
 * @author lwz
 *
 * @param <T>
 */
public class ObjectSimpleAdapter<T> extends BaseAdapter {
	
	private Context mContext;
	private List<T> mData;
	private int mLayoutRes;
	private String[] mFieldsName;
	private int[] mViewsId;
	
	/**
	 * @param context		上下文对象
	 * @param data			数据源
	 * @param layoutRes		子项布局
	 * @param fieldsName	待取值的字段名数组
	 * @param viewsId		待取值的字段 与 子布局中的 视图对应的 id 数组
	 */
	public ObjectSimpleAdapter(Context context, List<T> data, int layoutRes, String[] fieldsName, int[] viewsId) {
		mContext = context;
		mData = data;
		mLayoutRes = layoutRes;
		mFieldsName = fieldsName;
		mViewsId = viewsId;
	}

	@Override
	public int getCount() {
		return mData.size();
	}

	@Override
	public T getItem(int position) {
		return mData.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if( convertView == null ) {
			convertView = View.inflate(mContext, mLayoutRes, null);
		}

		Object[] values = ReflectObjectFieldsValue.getFieldsValue(getItem(position), mFieldsName);
		
		for( int i=0; i<mViewsId.length; i++ ) {
			View view = ViewHolder.getView(convertView, mViewsId[i]);
			if( mViewBinder != null ) {
				if( mViewBinder.setViewValue(position, view, values[i]) ) {
					continue;
				}
			}
			bindView(view, values[i]);
		}
		return convertView;
	}
	
	/**
 	 * 默认只可以为 ImageView 以及 TextView 控件绑定数据，若要 使用其他的一些 View 则可以调用 setViewBinder() 方法，实现 ViewBinder接口中的 setViewValue() 方法来达到
     * 将值绑定到其他的一些 View 上。
	 * 
	 * @param view
	 * @param data
	 */
	private void bindView(View view, Object data) {
		if( view instanceof ImageView ) {
			ImageView img = (ImageView)view;
			if( data instanceof Integer ) {
				img.setImageResource((Integer)data);
			} else if( data instanceof Bitmap ) {
				img.setImageBitmap((Bitmap)data);
			}
			
		} else if( view instanceof TextView ){
			TextView textView = (TextView)view;
			textView.setText(data.toString());
		}
	}
	
	/**
	 * 视图绑定接口
	 * @author lwz
	 */
	public interface ViewBinder {
		/**
		 * @param pos   当前项的索引
		 * @param view  
		 * @param data
		 * @return
		 */
		boolean setViewValue(int pos, View view, Object data);
	}

	private ViewBinder mViewBinder;
	
	public void setViewBinder(ViewBinder binder) {
		mViewBinder = binder;
	}
}
